#include <iostream>
#include <stdlib.h>
#include "MallocAlign.h"
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
using namespace std;
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void * MallocAlign( U64 size, U64 align ) {
   char ** basePtr;
   char ** infoPtr;
   char ** algnPtr;
   
   U64 mask = ~( align - 1 );
   U64 numBytes = size + align + sizeof( char* );
   
   basePtr = (char **) malloc( numBytes );
   if( basePtr == NULL ) {
      cout << "request for " << numBytes << " bytes returned NULL" << endl;
      return NULL;
   }
   
   // reserve space then align
   algnPtr = basePtr + 1;
   while( reinterpret_cast< U64 >( algnPtr ) != ( reinterpret_cast< U64 >( algnPtr ) & mask ) ) {
      algnPtr++;
   }
   
   infoPtr  = algnPtr - 1;
   *infoPtr = (char*)basePtr;

   return algnPtr;
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void FreeAlign( char * ptr ) {
   
   char ** algnPtr = (char**) ptr;
   char ** infoPtr = algnPtr - 1;
   free( (char*) *infoPtr );
}

///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
